<?php

require_once 'Framework/Controller/Action.php';
require_once 'Framework/File.php';

/**
 * Действия с неавторизированным пользователем
 *
 */
class UserController extends Framework_Controller_Action
{
    /**
     * Сообщения
     *
     * @var obj Framework_Config
     */
    protected $_messages;
    
    public function init()
    {
        $this->_messages = Framework_Registry::get('messages');
        $this->view->not_auth = !$this->session->get('logged_in');
    }
    
    /**
     * redirect
     *
     */
    public function indexAction()
    {
        $this->session->set('http_referer', '');
        // Если залогинен, разлогиневаемся
        if (true === $this->session->get('logged_in')) {
            $this->session->destroy(true);
            //$this->_redirect('/user/');
        // Гость идет на регистрацию
        } elseif (true === $this->session->get('guest_logged_in')) {
            // Отключаем гостя в таблице user
            User_Guest::disable($this->session->get('guest_id'));
            
            //Зачищаем гостя в комнатах
            Room::clean($this->session->get('guest_id'));
            $this->session->destroy(true);
            $this->_redirect('/user/registration/?reg=1&condition=Agree');
        }
        
        $this->render();
    }
    
    /**
     * Регистрация
     *
     */
    public function registrationAction()
    {
        // Залогиненный кыш
        $this->_loggedRedirect();
        
        if ($this->getRequest()->getMethod() != 'POST') { // Not a POST request
            // Если не согласился с лицензией вали отсюдова
            if ($this->getRequest()->getQuery('reg') != 1) {
                $this->_redirect('/');
            }
            // Записываем лицензию в сессию, для того чтобы при ошибках сабмита формы не перекинуло на главную
            // Если регистрировался ставим флаг
            if ($reg = $this->session->get('registration')) {
                $this->view->registration = $reg;
                $this->view->user_id = $this->session->get('user_id');
                $this->session->set('registration', false);
            } else {
                $this->view->month = 'empty';
                $this->view->year  = 'empty';
                $this->view->day   = 'empty';
            }   
        } else {
            // Handle log-in form
            $form = get_value($this->getRequest()->getPost('form'));
            $form['month'] = $this->getRequest()->getPost('Date_Month');
            $form['day']   = $this->getRequest()->getPost('Date_Day');
            $form['year']  = $this->getRequest()->getPost('Date_Year');
            $form['born'] = $form['year']  . '-'
                          . $form['month'] . '-'
                          . $form['day'];
            if (($error = $this->_registrationValidate($form)) !== false) { // Not valid
                $this->view->error = $error;
                $this->view->form  = $form;
                $this->view->month = $this->getRequest()->getPost('Date_Month');
                $this->view->year  = $this->getRequest()->getPost('Date_Year');
                $this->view->day   = $this->getRequest()->getPost('Date_Day');
                                
            } else { // Valid registration
                if ($user = User_Self::createUser($form)) {
                    $this->session->set('user_id', $user->getUserId());
                    $this->session->set('registration', true);
                    
                    // Создаем папку пользователя
                    $path = $this->_getUserPath($user->getUserId());
                    
                    $this->session->set('user_path', $path);
                    $user->setPath($path);
                    
                    $this->session->set('logged_in', true);
                    $this->session->set('user_login', $form['username']);
                    $this->session->set('user_id', $user->getUserId());
                }
                $this->session->set('reg', 1);
                $this->_redirect('/user/upload/');
            }
        }
        
        $this->render();
    }

    /**
     * Авторизация
     *
     */
    public function loginAction()
    {
        $this->_loggedRedirect();
        
        if ($this->getRequest()->getMethod() != 'POST') {

            // Not a POST request, show log-in form
        } else {
            // Handle log-in form
            $login = $this->getRequest()->getPost('login');
            $pass  = $this->getRequest()->getPost('password');
            
            $user = User_Self::getCorrectUser($login, $pass);
            if ($user instanceof User_Abstract) {
                $this->session->set('logged_in', true);
                $this->session->set('user_login', $login);
                $this->session->set('user_id', $user->getUserId());
                
                $user->setPath($this->_getUserPath($user->getUserId(), true));
                
                // Редиректим на страницу с которой пришел
                if ($query_string_referer = $this->session->get('http_referer')) {
                    $this->_redirect($query_string_referer);
                } else if ($query_string_referer = $this->session->get('room_http_referer')) {
                    // Получилось не очень, но в комнату могут заходить гости и пользователи
                    $query_string_referer = str_replace('ghome', 'home', $query_string_referer);
                    $this->_redirect($query_string_referer);
                }
                $this->_redirect('/home/'); // . $user_id . '/'
            } else { // Wrong user name / password
                $this->view->login = $login;
                $this->view->error = $this->_messages->user->auth;              
            }
        }
        
        $this->render();
    }
    
    /**
     * Выход
     *
     */
    public function logoutAction()
    {
        //Зачищаем юзера в комнатах
        Room::clean($this->session->get('user_id'));
        $this->session->destroy(true);
        
        $this->_redirect('/');
    }
    
    /**
     * Загрузка фотографии
     *
     */
    public function uploadAction()
    {
        // Здесь может находиться либо залогиненный либо пришедший с регистрации. Остальные стоп.
        if (true != $this->session->get('logged_in')) {
            if (1 != $this->session->get('reg')) {
                $this->_redirect('/');
            }
        }
        
        if ($this->getRequest()->getMethod() != 'POST') { // Not a POST request
            if ($upload = $this->session->get('upload')) {
                $this->view->upload = $upload;
                $this->session->set('upload', false);
            }
        } else {
            $user = new User_Self($this->session->get('user_id'));
            try {
                $avatar = new Framework_File('photo');
                $type   = $avatar->imageType();
                $path   = $this->_getUserPath($user->getUserId());
                $filepath     = PATH_ROOT . $path . '/avatar.' . $type;
                $filepath_min = PATH_ROOT . $path . '/min/avatar.' . $type;
                $avatar->MoveTo($filepath);
				// kiote
				$user->nullRating($user->getUserId()); 
				//
            } catch (Framework_File_Exception $e) {
                //dumper($e->getMessage()); dumper($e->getCode()); dumper($e->getFile()); dumper($e->getTrace());
                $this->view->error = $e->getMessage();
                $this->render();
            }
            
            img_resize($filepath, $filepath, 300, 300, 0xFFFFFF, 80);
            img_resize($filepath, $filepath_min, 150, 150, 0xFFFFFF, 80);
            
            chmod($filepath, 0755);
            chmod($filepath_min, 0755);
            
            $user->setAvatar('avatar.' . $type);
            $user->activate();
            $this->session->set('upload', true);
            
            $this->_redirect('/user/upload/');
        }
        
        $this->render();
    }

    /**
     * Перенаправление авторизированных пользователей
     *
     */
    private function _loggedRedirect()
    {
        //Залогиненому здесь нечего делать, редиректим на его страницу
        if (true === $this->session->get('logged_in')) {
            $this->_redirect('/home/');
        }
    }
    
    /**
     * Валидация регистрационной формы
     *
     * @param array $form
     * @return array | Если нет ошибок возвращает false
     */
    private function _registrationValidate($form)
    {
        $errors = array();

        if (empty($form['username']) ||
            empty($form['password']) ||
            empty($form['password_again']) ||
            empty($form['mail']) ||
            empty($form['sex']) ||
            empty($form['born']) ||
            empty($form['number']) ||
            empty($form['country']) ||
            empty($form['city'])) {
                $errors['empty'] = $this->_messages->user->empty;
        }
        if (!preg_match("[^[а-яa-z\s_'0-9]*$]siu", $form['username'])) {
            $errors['username'] = $this->_messages->user->wrongUsername;
        } else if (User_Self::findUserIdByLogin($form['username'])) {
            $errors['username'] = $this->_messages->user->usedUsername;
        }
        if ($form['password'] != $form['password_again']) {
            $errors['password'] = $this->_messages->user->wrongPassword;
        }
        if (strlen($form['password']) < 6) {
            $errors['password'] = $this->_messages->user->shortPassword;
        }
        if (!@checkdate($form['month'], $form['day'], $form['year'])) {
            $errors['born'] = $this->_messages->user->wrongBorn;
        }
        if (!preg_match('[^\d{10,}$]si', $form['number'])) {
            $errors['number'] = $this->_messages->user->wrongNumber;
        } else if (User_Self::findUserIdByPhone($form['number'])) {
            $errors['number'] = $this->_messages->user->usedNumber;
        }
        if (!preg_match('[\w+@\w+.\w{2,4}]si', $form['mail'])) {
            $errors['mail'] = $this->_messages->user->wrongMail;
        } else if (User_Self::findUserIdByMail($form['mail'])) {
            $errors['mail'] = $this->_messages->user->usedMail;
        }
        if (sizeof($errors)) { return $errors; }
        
        return false;
    }
    
    /**
     * Определяет и создает пользовательскую директорию на сервере
     *
     * @param int $user_id
     * @param bool $create
     * @return string
     */
    protected function _getUserPath($user_id, $create = false)
    {
        $uploads = '/uploads';
        $folder  = floor($user_id/1000);
        if ($create) {
            @mkdir(PATH_ROOT . $uploads . '/' . $folder);
            @mkdir(PATH_ROOT . $uploads . '/' . $folder . '/' . $user_id);
            @mkdir(PATH_ROOT . $uploads . '/' . $folder . '/' . $user_id . '/min');
        }
        
        return $uploads . '/' . $folder . '/' . $user_id;
    }

    /**
     * Пользовательское соглашение
     *
     */
    public function conditionAction()
    {
        $this->render();
    }
}